home *** CD-ROM | disk | FTP | other *** search
/ Aminet 40 / Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso / Aminet / comm / tcp / rxsocket.lha / rxsocket / Examples / ip2if.rexx < prev    next >
OS/2 REXX Batch file  |  1999-05-29  |  3KB  |  111 lines

  1. /* route example: shows the name of the interface used for an address */
  2.  
  3. l="rmh.library";if ~show("L",l) then;if ~addlib(l,0,-30) then exit
  4. if AddLibrary("rexxsupport.library","rxsocket.library","rxlibnet.library")~=0 then exit
  5.  
  6. prg=ProgramName("NOEXT")
  7.  
  8. if ~IsLibOn("SOCKET") then do
  9.     say "No tcp/ip stack is running."
  10.     say "This macro works ONLY with Miami."
  11.     say "DO NOT ABSOLUTLY LAUNCH THIS MACRO IF GENESIS IS RUNNING!"
  12.     exit
  13. end
  14.  
  15. if ~IsLibOn("MIAMI") then do
  16.     say "This macro works ONLY with Miami."
  17.     say "DO NOT ABSOLUTLY LAUNCH THIS MACRO IF GENESIS IS RUNNING!"
  18.     exit
  19. end
  20.  
  21. if ~open("STDERR","CONSOLE:","W") then stderr="STDOUT"
  22. if ~RMH_ReadArgs("ADDRESS/A") then do
  23.     call PrintFault()
  24.     exit
  25. end
  26.  
  27. addr=resolve(parm.0.value)
  28. if addr=-1 then call err "can't resolve <"parm.0.value">",1
  29.  
  30. s=socket("ROUTE","RAW")
  31. if s<0 then call err "no socket"
  32.  
  33. len  = 92+16
  34. type = char(4)
  35. pid  = MiamiGetPid()
  36. seq  = long(1)
  37.  
  38. rtm = short(len)                    /* u_short    rtm_msglen             */
  39. rtm = rtm || char(4)                /* u_char    rtm_version;        */
  40. rtm = rtm || type                    /* u_char    rtm_type;            */
  41. rtm = rtm || short(0)               /* u_short    rtm_index            */
  42. rtm = rtm || short(0)               /* u_short     rtm_pad1;            */
  43. rtm = rtm || long(0)                /* long     rtm_flags;            */
  44. rtm = rtm || long(or(1,16))         /* long     rtm_addrs            */
  45. rtm = rtm || pid                    /* void         *rtm_pid            */
  46. rtm = rtm || seq                      /* long     rtm_seq                */
  47. rtm = rtm || long(0)                /* long     rtm_errno            */
  48. rtm = rtm || long(0)                /* long     rtm_use                */
  49. rtm = rtm || long(0)                /* u_long    rtm_inits            */
  50. rtm = rtm || nul(56)                /* struct    rt_metrics rtm_rmx    */
  51.  
  52. sin = char(16)                        /* u_char     sin_len                */
  53. sin = sin || char(2)                /* u_char      sin_family            */
  54. sin = sin || short(0)                  /* u_short     sin_port            */
  55. sin = sin || pad(addr2c(addr),4)    /* struct      in_addr sin_addr     */
  56. sin = sin || nul(8)                 /* char           sin_zero[8]            */
  57.  
  58. rtm = rtm || sin
  59.  
  60. if send(s,rtm,len)<0 then do
  61.     if Errno()~=3 then call err "send error"
  62.     say "<"addr"> is unreacheble"
  63.     exit
  64. end
  65.  
  66. do until res<=0 | (t=type & se=seq & p=pid)
  67.     res = recv(s,"RTM",1024)
  68.     if res>0 then
  69.         parse var rtm d +2 d +1 t +1 index +2 d +2 d +4 d +4 p +4 se +4 rest
  70. end
  71. if res<0 then call err "recv error"
  72.  
  73. if=MiamiIFIndexToName(c2d(index))
  74. if if="" then do
  75.     say "<"addr"> is unreacheble"
  76.     exit
  77. end
  78. if ~Datatype(right(if,1),"N") then if=if"0"
  79. sd=socket("INET","DGRAM")
  80. if s<0 then call err "socket error"
  81.  
  82. if IoctlSocket(sd,"SIOCGIFADDR",if,"IFADDR")<0 then call err "ioctl error"
  83. say "<"addr"> -> '"if"' ["IFAddr"]"
  84. exit
  85.  
  86. err: procedure expose prg stderr
  87. parse arg msg,ntdoerr
  88.     if ntdoerr~=1 then msg = msg "("ErrorString()")"
  89.     call writeln(stderr,prg":" msg)
  90.     exit
  91.  
  92. pad: procedure
  93. parse arg c,i
  94.     return right(copies("00"x,i)||c,i)
  95.  
  96. char: procedure
  97. parse arg i
  98.     return d2c(i)
  99.  
  100. short: procedure
  101. parse arg i
  102.     return right("0000"x||d2c(i),2)
  103.  
  104. long: procedure
  105. parse arg i
  106.     return right("00000000"x||d2c(i),4)
  107.  
  108. nul: procedure
  109. parse arg i
  110.     return copies("00"x,i)
  111.